import os
import time
import random
from DrissionPage import ChromiumPage
from urllib.parse import quote
from tqdm import tqdm


def sign_in():
    sign_in_page = ChromiumPage()
    sign_in_page.get('https://www.xiaohongshu.com')
    print("请扫码登录")
    # 第一次运行需要扫码登录
    time.sleep(20)


# 搜索关键词
keywords = []
page = ChromiumPage()
res_set = set()


def read_keywords():
    global keywords
    # 打开文件，使用读取模式
    with open("keywords.txt", "r", encoding="utf-8") as file:
        # 使用 readlines() 方法读取文件的所有行，并将其存储到列表中
        string_list = [line.strip() for line in file.readlines()]

    # 关闭文件
    # 输出读取到的列表内容
    keywords = string_list


def handle_key_word(keyword):
    # 关键词转为 url 编码
    keyword_temp_code = quote(keyword.encode('utf-8'))
    keyword_encode = quote(keyword_temp_code.encode('gb2312'))

    return keyword_encode


def page_scroll_down():
    print("********下滑页面********")
    # 生成一个随机时间
    random_time = random.uniform(0.5, 1.5)
    # 暂停
    time.sleep(random_time)
    # time.sleep(1)
    # page.scroll.down(5000)
    page.scroll.to_bottom()


def search(keyword):
    global page
    page = ChromiumPage()
    page.get(f'https://www.xiaohongshu.com/search_result?keyword={keyword}&source=web_search_result_notes')


def savaLinks(keyword):
    # 将集合转换为列表
    string_list = list(res_set)
    # 打开一个文件，使用写入模式
    with open(os.path.join("links_data", keyword + ".txt"), "w") as file:
        # 遍历列表中的每个字符串，并将其写入文件中
        for string in string_list:
            file.write(string + "\n")


def get_info():
    try:
        # 尝试执行可能会出错的代码段
        # 定位包含笔记信息的sections
        container = page.ele('.feeds-page')
        sections = container.eles('.note-item')
    except Exception as e:
        # 发生异常时执行的代码段
        # print(f"An error occurred: {e}")
        # 可选：在这里添加你想要执行的异常处理代码
        pass  # pass 语句表示不做任何操作，直接跳过当前块
    for section in sections:
        try:
            # 尝试执行可能会出错的代码段
            note_link = section.ele('tag:a', timeout=0).link
            # print('当前文章', note_link)
            res_set.add(note_link)
        except Exception as e:
            # 发生异常时执行的代码段
            # print(f"An error occurred: {e}")
            # 可选：在这里添加你想要执行的异常处理代码
            pass  # pass 语句表示不做任何操作，直接跳过当前块


def craw(times):
    for i in tqdm(range(1, times + 1)):
        get_info()
        page_scroll_down()


if __name__ == '__main__':
    # sign_in()
    read_keywords()
    for keyword in keywords:
        # 根据关键词搜索小红书文章
        search(handle_key_word(keyword))
        # 根据设置的次数，开始爬取数据
        craw(15)
        savaLinks(keyword)
        print("关键词：" + keyword + "，爬取结果长度：" + str(len(res_set)) + "，已保存至" + keyword + ".txt 文件中")
        res_set = set()
